﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Ventas
{
    public class OrdenVentaBL
    {
        public int AddOrdenVenta(
                                DateTime fecha, 
                                int idCliente, 
                                int? idcocliente,
                                bool bitCoPropietario,
                                int idFormatoVenta,
                                int? idProforma,
                                string comentario, 
                                int? idBanco,
                                 int idProyecto,
                                int idMoneda,
                                bool bitCuentaAhorro,
                                DataSet entitylist)
        {
             using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                 Empleado empleado = _db.Empleados.Single(p=>p.idInternal==idEmpleadoEmisor);
                 Proyecto Proyecto=_db.Proyectos.Single(p=>p.idInternal==idProyecto);
                 FormatoVenta formatoVenta = _db.FormatoVentas.Single(p => p.idinternal == idFormatoVenta);
                 OrdenVenta ordenVenta = new OrdenVenta();
                
                  //totalSeparacion


                 if (formatoVenta.bitBanco== false)
                 {
                     idBanco = null;
                 }
                 ordenVenta.AddSet(
                                    _db,
                                    ordenVenta.getCorrelativo(_db,idProyecto),
                                    idCliente,
                                    bitCoPropietario?idcocliente:null,
                                    bitCoPropietario,
                                    idProforma,
                                    idFormatoVenta,
                                    idEmpleadoEmisor,
                                    fecha,
                                    idEmpleadoEmisor,
                                    empleado.usuario,
                                    comentario,
                                    5, //pendiente 
                                    idProyecto,
                                    bitCuentaAhorro==true?1:2,
                                    idBanco,
                                    idMoneda
                                    );


                 

                _db.SubmitChanges();

                OrdenVentaSeg ordenVentaSeg = new OrdenVentaSeg();

                ordenVentaSeg.AddSet(_db, ordenVenta.idInternal);


                _db.SubmitChanges();

                DataSet dsDiferencias = new DataSet();



                if (entitylist.HasChanges())
                {
                    dsDiferencias.Merge(entitylist.GetChanges());

                    if (dsDiferencias.Tables["OrdenVentaItemInfo"].Rows.Count == 0)
                    {
                        throw new Exception("No debe existir Orden de Ventas sin Items");
                    }

                    foreach (DataRow drw in dsDiferencias.Tables["OrdenVentaItemInfo"].Rows)
                    {
                        if (drw.RowState == DataRowState.Added)
                        {
                            var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));

                            if (UI.idEstado != 1)
                            {
                                throw new Exception("el {0} {1} no  esta disponible ".Fmt(UI.UITipo.descripcion,UI.codigo));
                            }

                            
                            OrdenVentaItem ordenVentaItem = new OrdenVentaItem();
                            ordenVentaItem.AddSet(_db,
                                   ordenVenta.idInternal,
                                   drw.Field<int>("idUI"),
                                   UI.idMoneda,
                                   UI.precio,
                                   drw.Field<bool>("bitFinanciado"));
                            // su formato de Venta
                            _db.SubmitChanges();
                            AddFormatoVenta(_db, ordenVentaItem, ordenVenta, drw.Field<decimal>("totalSeparacion"));

                            //actualiza la UI
                            UI.SetUpdateEstado(2); //separado


                        }

                    }
                }
                _db.SubmitChanges();
              
                 //carga los requisitos necesarios  para la generacion de requisitos
                 // para el caso de copropietario verficamos que se de el caso de un  Natural y otro Empresa
                 //DAL.Cliente cliente =_db.Clientes.Single(p=>p.idInternal==idCliente);

                 //caso del copropietario


                var reqTotal = _db.UIRequisitoItems.Where(p => p.idInternal==0);

                 // caso de propietario
                if (ordenVenta.Cliente.bitEsJuridica)
                {
                    var reqEmpresa = _db.UIRequisitoItems.Where(p => p.bitEmpresa == ordenVenta.Cliente.bitEsJuridica);
                    reqTotal=reqTotal.Concat(reqEmpresa);
                }
                else
                {
                    var reqpersona = _db.UIRequisitoItems.Where(p => p.bitPersona == !ordenVenta.Cliente.bitEsJuridica);
                    reqTotal=reqTotal.Concat(reqpersona);

                }
                 //copropietario
                if (ordenVenta.bitCopropietario)
                {
                    if (ordenVenta.Cliente1.bitEsJuridica)
                    {
                        var reqEmpresa = _db.UIRequisitoItems.Where(p => p.bitCopropietarioEmp == ordenVenta.Cliente1.bitEsJuridica);
                        reqTotal = reqTotal.Concat(reqEmpresa);
                    }
                    else
                    {
                        var reqpersona = _db.UIRequisitoItems.Where(p => p.bitCopropietarioPer == !ordenVenta.Cliente1.bitEsJuridica);
                        reqTotal=reqTotal.Concat(reqpersona);

                    }
                }

             
               
               

                foreach (var item in reqTotal)
                    {
                        OrdenVentaRequisito ovRequisito = new OrdenVentaRequisito();
                            ovRequisito.AddSet(_db,item.idInternal,false,ordenVenta.idInternal,null);

                        _db.SubmitChanges();
                    }
                if (formatoVenta.bitCH)
                {
                    OrdenVentaRequisito ovRequisito = new OrdenVentaRequisito();
                    ovRequisito.AddSet(_db, 11, false, ordenVenta.idInternal, null);  //11 carta de  aprobacion

                    _db.SubmitChanges();
                }

                 var contratos=_db.GrupoDatoitems.Where(p=>p.idGrupo==19);
                 foreach (var item in contratos)
                {
                    OrdenVentaContrato ovcontrato = new OrdenVentaContrato();
                    ovcontrato.AddSet(_db, item.idInternal, false, ordenVenta.idInternal, null);

                    _db.SubmitChanges();
                }
                 

                

                


                ts.Complete();
                return ordenVenta.idInternal;


                
            }
        }


        public void finalizarVenta (int idOrdenVenta){
               using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                OrdenVenta ordenventa = _db.OrdenVentas.Single(p => p.idInternal == idOrdenVenta);
                  int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                  ordenventa.considerarVenta(7, idEmpleadoEmisor);

                
                   var w= from a in _db.OrdenVentaItems
                          where a.OrdenVenta.idInternal==idOrdenVenta
                          select a.UI;

                foreach (var item in w)
                {

                    item.idEstado = 16;
                }

                _db.SubmitChanges();

                ts.Complete();
               }

        }


        public void SetMontoCreditoHipotecario(dbGestionDataContext _db,int idOrdenVenta,int idUI,decimal total)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                            OrdenVentaItem item = _db.OrdenVentaItems.Single(p => p.idUI == idUI & p.idOrdenVenta == idOrdenVenta);


                            OrdenVentaFormato creditoHipotecario = item.OrdenVentaFormatos.Single(p => p.idConcepto == 3);
                            OrdenVentaFormato Bono = item.OrdenVentaFormatos.Single(p => p.idConcepto == 2);
                            OrdenVentaFormato cuotaInicial = item.OrdenVentaFormatos.Single(p => p.idConcepto == 1);
                            OrdenVentaFormato separacion = item.OrdenVentaFormatos.Single(p => p.idConcepto == 4);

                 if (total > item.total | total < 0)
                {
                    throw new Exception("El monto no puede ser mayor al total de la Unid. Inmobiliaria");
                }
                 if (creditoHipotecario.totalPago > 0)
                 {
                     throw new Exception("El Credito Hipotecario se encuentra Pagado");
                 }


                
                creditoHipotecario.total = total;


                cuotaInicial.total = item.total - creditoHipotecario.total - Bono.total - separacion.total;

                    if (cuotaInicial.total < 0)
                    {
                        throw new Exception("el monto supera el limite {0}{1}".Fmt(item.Moneda.simbol,item.total));
                    }
                        //ya con el nuevo dato
                
                    if ((cuotaInicial.total - cuotaInicial.totalFin - cuotaInicial.totalPago) < 0)
                    {
                        throw new Exception("el monto supera el limite {0}{1}".Fmt(item.Moneda.simbol, (cuotaInicial.total - cuotaInicial.totalFin - cuotaInicial.totalPago)));

                    }

                _db.SubmitChanges();
                ts.Complete();


            }
        }


        public void SetMontoBono(dbGestionDataContext _db, int idOrdenVenta, int idUI, decimal total)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                OrdenVentaItem item = _db.OrdenVentaItems.Single(p => p.idUI == idUI & p.idOrdenVenta == idOrdenVenta);


                OrdenVentaFormato creditoHipotecario = item.OrdenVentaFormatos.Single(p => p.idConcepto == 3);
                OrdenVentaFormato Bono = item.OrdenVentaFormatos.Single(p => p.idConcepto == 2);
                OrdenVentaFormato cuotaInicial = item.OrdenVentaFormatos.Single(p => p.idConcepto == 1);
                OrdenVentaFormato separacion = item.OrdenVentaFormatos.Single(p => p.idConcepto == 4);

                if (total > item.total | total < 0)
                {
                    throw new Exception("El monto no puede ser mayor al total de la Unid. Inmobiliaria");
                }
                if (Bono.totalPago> 0)
                {
                    throw new Exception("El Bono se encuentra Pagado");
                }

               

                cuotaInicial.total = item.total - creditoHipotecario.total - total - separacion.total;
                if (cuotaInicial.total < 0)
                {
                    throw new Exception("el monto supera el limite {0}{1}".Fmt(item.Moneda.simbol, item.total));
                }
                Bono.total = total;

                if ((cuotaInicial.total - cuotaInicial.totalFin - cuotaInicial.totalPago) < 0)
                {
                    throw new Exception("verifique el monto Pagado {2}{0:N} ó  el monto fraccionado {2}{1:N}".Fmt(cuotaInicial.totalPago, cuotaInicial.totalFin, item.Moneda.simbol, item.total));
                }

                if ((cuotaInicial.total - cuotaInicial.totalFin - cuotaInicial.totalPago) < 0)
                {
                    throw new Exception("el monto supera el limite {0}{1}".Fmt(item.Moneda.simbol, (cuotaInicial.total - cuotaInicial.totalFin - cuotaInicial.totalPago)));

                }
                _db.SubmitChanges();
                ts.Complete();


            }
        }

        public void AnularVenta(dbGestionDataContext _db ,int idOrdenVenta)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                
               

                OrdenVenta ordenventa = _db.OrdenVentas.Single(p => p.idInternal == idOrdenVenta);
                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado empleado=_db.Empleados.Single(p=>p.idInternal==idEmpleadoEmisor);

                
                ordenventa.anulaOrdenVenta(10, idEmpleadoEmisor, empleado.usuario);    //10anular


                var w = from a in _db.OrdenVentaItems
                        where a.OrdenVenta.idInternal == idOrdenVenta
                        select a.UI;

                foreach (var item in w)
                {

                    item.idEstado = 1;
                }

                _db.SubmitChanges();

                ts.Complete();
            }

        }



        public void DesAnularVenta(dbGestionDataContext _db, int idOrdenVenta)
        {
            using (TransactionScope ts = new TransactionScope())
            {




                //OrdenVenta ordenventa = _db.OrdenVentas.Single(p => p.idInternal == idOrdenVenta);
                //int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                //ordenventa.idEstado = 10;
                //ordenventa.idUsuarioMod = idEmpleadoEmisor;
                //ordenventa.fechaMod = DateTime.Now;

                //var w = from a in _db.OrdenVentaItems
                //        where a.OrdenVenta.idInternal == idOrdenVenta
                //        select a.UI;

                //foreach (var item in w)
                //{

                //    item.idEstado = 1;
                //}

                //_db.SubmitChanges();

                //ts.Complete();
            }

        }
        private void AddFormatoVenta(dbGestionDataContext _db, 
                                    OrdenVentaItem ordenVentaItem, 
                                    OrdenVenta ordenVenta, 
                                    decimal totalSeparacion)
        {
            
            decimal contado = 0;
            decimal Bono = 0;
            decimal cuotaInicial = 0;
            decimal CH = 0;
            decimal separacion=0;

            // solo el departamento/lotes
            // para el caso de departamentos 
            FormatoVenta formatoVenta = _db.FormatoVentas.Single(p => p.idinternal == ordenVenta.idFormatoVenta);
            //caculamos la separacion

            decimal totalUI = ordenVentaItem.total;
            //---------------- para el calculo de los saldos segun venta
            // para el caso de contado debe estar en  false los 2 var, bono,banco,

            if (formatoVenta.bitBono == true)
            {


                if (ordenVentaItem.UI.UITipo.bitBono)
                {
                    var uibono = _db.UIBonos.SingleOrDefault(p => p.anio == ordenVenta.fecha.Year);

                    if ( uibono==null)
                    {
                        throw new Exception("ingrese informacion del Bono para el año {0}".Fmt(ordenVenta.fecha.Year));
                    }

                        Bono = uibono.valor;

                }
            }
            
            if (ordenVentaItem.UI.UITipo.bitSeparacion)
            {
                separacion = totalSeparacion;
            }

            if (ordenVentaItem.bitFinanciado)
            {

                if (formatoVenta.bitBanco == true)
                {
                    // del total del CI 
                    // para el calculo del CI necesito saber la banco y su proyecto, no es necesario la moneda

                    CuentaFinanciamiento cuentafinanciamiento = _db.CuentaFinanciamientos.
                             SingleOrDefault(p => p.idProyecto == ordenVenta.idProyecto &
                                                 p.idBanco == ordenVenta.idBanco);

                    if (cuentafinanciamiento != null)
                    {
                        // si existe entonces esto pertence al financiamiento

                        if (ordenVentaItem.UI.UITipo.bitCH)
                        {
                            // // solo el departamento/lotes
                            cuotaInicial = (cuentafinanciamiento.bitEsMontoCI) ? cuentafinanciamiento.cuotaInicial : cuentafinanciamiento.cuotaInicial / 100 * totalUI;
                            if (separacion >= cuotaInicial)
                            {
                                cuotaInicial = 0;
                            }
                            else
                            {
                                cuotaInicial = cuotaInicial - separacion;
                            }
                            CH = totalUI - cuotaInicial - Bono - separacion;

                        }
                        else
                        {
                            CH = 0;

                        }

                    }


                }



            }

            

            contado = totalUI - CH - Bono - separacion;



            //------------------
            //registramos su estado de venta
            //1.- Separacion
            //2.- Cuota inical
            //3.- Saldo a Pagar
            //4.- Saldo Bono
            //5.- Saldo Credito Hipotcario

            DAL.OrdenVentaFormato ordeventaFormato = new OrdenVentaFormato();
            ordeventaFormato.addSet(_db, 1, "1000", contado, ordenVentaItem.idMoneda, ordenVentaItem.idInternal, ordenVentaItem.UI.idTipoUI,  null, ordenVenta.fecha.AddMonths(1));
            _db.SubmitChanges();

            ordeventaFormato = new OrdenVentaFormato();
            ordeventaFormato.addSet(_db, 2, "2000", Bono, ordenVentaItem.idMoneda, ordenVentaItem.idInternal, ordenVentaItem.UI.idTipoUI,  null, ordenVenta.fecha.AddMonths(1));
            _db.SubmitChanges();
            
            ordeventaFormato = new OrdenVentaFormato();
            ordeventaFormato.addSet(_db, 3, "3000", CH, ordenVentaItem.idMoneda, ordenVentaItem.idInternal, ordenVentaItem.UI.idTipoUI,  null, ordenVenta.fecha.AddMonths(1));
            _db.SubmitChanges();

            ordeventaFormato = new OrdenVentaFormato();
            ordeventaFormato.addSet(_db, 4, "4000", separacion, ordenVentaItem.idMoneda, ordenVentaItem.idInternal, ordenVentaItem.UI.idTipoUI, null, ordenVenta.fecha.AddMonths(1));
            _db.SubmitChanges();
            

            
            
        }

        public void UpdateFormatoVenta(dbGestionDataContext _db, 
                                            OrdenVentaItem ordenVentaItem,
                                            OrdenVenta ordenVenta,
                                           decimal totalSeparacion)
        {

            decimal contado = 0;
            decimal Bono = 0;
            decimal cuotaInicial = 0;
            decimal CH = 0;
            decimal separacion = 0;
            
            //row con todos los formatos de venta
            FormatoVenta formatoVenta = _db.FormatoVentas.Single(p => p.idinternal == ordenVenta.idFormatoVenta);
          

            //caculamos la separacion

            decimal totalUI = ordenVentaItem.total;
            //---------------- para el calculo de los saldos segun venta
            // para el caso de contado debe estar en  false los 2 var, bono,banco,


            //con beneficios de estado o fracmentado
            // // solo el departamento/lotes
            if (formatoVenta.bitBono == true)
            {
                

                if (ordenVentaItem.UI.UITipo.bitBono)
                {
                    // // solo el departamento/lotes
                                //debe existir el la tabla

                    var uibono = _db.UIBonos.SingleOrDefault(p => p.anio == ordenVenta.fecha.Year);

                    if ( uibono==null)
                    {
                        throw new Exception("ingrese informacion del Bono para el anio {0}".Fmt(ordenVenta.fecha.Year));
                    }

                        Bono = uibono.valor;
                                      
                }
            }

            if (ordenVentaItem.UI.UITipo.bitSeparacion)
            {
                separacion = totalSeparacion;
            }

            if (ordenVentaItem.bitFinanciado)
            {
                if (formatoVenta.bitBanco == true)
                {
                    // del total del CI 
                    // para el calculo del CI necesito saber la banco y su proyecto, no es necesario la moneda

                    CuentaFinanciamiento cuentafinanciamiento = _db.CuentaFinanciamientos.
                             SingleOrDefault(p => p.idProyecto == ordenVenta.idProyecto &
                                                 p.idBanco == ordenVenta.idBanco);

                    if (cuentafinanciamiento != null)
                    {
                        // si existe entonces esto pertence al financiamiento

                        if (ordenVentaItem.UI.UITipo.bitCH)
                        {
                            // // solo el departamento/lotes
                            cuotaInicial = (cuentafinanciamiento.bitEsMontoCI) ? cuentafinanciamiento.cuotaInicial : cuentafinanciamiento.cuotaInicial / 100 * totalUI;
                            if (separacion >= cuotaInicial)
                            {
                                cuotaInicial = 0;
                            }
                            else
                            {
                                cuotaInicial = cuotaInicial - separacion;
                            }
                            CH = totalUI - cuotaInicial - Bono - separacion;

                        }
                        else
                        {
                            CH = 0;

                        }

                    }


                }
            }
          

               var bonorow = ordenVentaItem.OrdenVentaFormatos.Single(p => p.idConcepto == 2);
               var crehipotecarioRow = ordenVentaItem.OrdenVentaFormatos.Single(p => p.idConcepto == 3);

              
                   CH =(crehipotecarioRow.totalPago != 0?crehipotecarioRow.totalPago:CH);
                   Bono = (bonorow.totalPago != 0 ? bonorow.totalPago : Bono);

                   contado = totalUI - CH - Bono - separacion;

                  


                   //------------------
                   //registramos su estado de venta
                   //4.- Separacion
                   //1.- Cuota inical
                   //3.- Saldo a Pagar
                   //2.- Saldo Bono
                   //3.- Saldo Credito Hipotcario


                   var qOrigen = from a in _db.OrdenVentaFormatos
                                 where a.idOrdenVentaItem == ordenVentaItem.idInternal
                                 select a;


               foreach (var item in qOrigen)
               {
                   if(item.idConcepto==1)
                   {
                       //contado
                       item.total = contado;
                       item.idTipoUI = ordenVentaItem.UI.idTipoUI;

                   }
                   if(item.idConcepto==2)
                   {
                       //Bono
                       item.total = Bono;
                       item.idTipoUI = ordenVentaItem.UI.idTipoUI;
                   }
                   if(item.idConcepto==3)
                   {

                       //CH
                       item.total = CH;
                       item.idTipoUI = ordenVentaItem.UI.idTipoUI;
                   }
                   if (item.idConcepto == 4)
                   {

                       //Separacion
                       item.total = separacion;
                       item.idTipoUI = ordenVentaItem.UI.idTipoUI;
                   }
      
               }

            _db.SubmitChanges();





        }
         private void DeleteFormatoVenta(dbGestionDataContext _db, 
                                        OrdenVentaItem ordenVentaItem)
        {

            //------------------
            //registramos su estado de venta
            //1.- Separacion
            //2.- Cuota inical
            //3.- Saldo a Pagar
            //4.- Saldo Bono
            //5.- Saldo Credito Hipotcario

            var qformatos = from a in _db.OrdenVentaFormatos
                    where a.idOrdenVentaItem == ordenVentaItem.idInternal
                    select a;

            foreach (var item in qformatos)
	            {

                    // si existe financiamiento  o pagos no puede ser eliminado
                    
                    if (item.RendicionVentaItems.Count() > 0)
                    {
                        throw new Exception("Existen Pagos");
                    }
                    if (item.FinanciamientoItems.Count() > 0)
                    {
                        throw new Exception("Fue Generados Cuotas , verifique");
                    }

                    _db.OrdenVentaFormatos.DeleteOnSubmit(item);
		 
	            }

            
           
            _db.SubmitChanges();

          




        }

        public int UpdateOrdenVenta( int idOrdenVenta,
                                      int idCliente,
                                bool bitcopropietario,
                                int? idCoCliente,
                                DateTime fecha,
                              int idFormatoVenta,
                              string comentario,
                              int? idBanco,
                              bool bitCuentaAhorro,
                              DataSet entitylist)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado empleado = _db.Empleados.Single(p => p.idInternal == idEmpleadoEmisor);

                OrdenVenta ordenVenta = _db.OrdenVentas.Single(p=>p.idInternal==idOrdenVenta);

                FormatoVenta formatoVenta = _db.FormatoVentas.Single(p => p.idinternal == idFormatoVenta);

                if (formatoVenta.bitBanco== false)
                {
                    idBanco = null;
                }

                // cambio de formato de venta

                if (idFormatoVenta!=ordenVenta.idFormatoVenta)
                {
                //bono

                //1	Contado
                //2	Cuota Inicial / Credito Hipotecario
                //3	Cuota Inicial  /  BONO/  Credito Hipotecario
                //4	Contado/ BONO

                    if (idFormatoVenta == 1 | idFormatoVenta == 2)    //ci+ch
                    {
                        var bono = _db.RendicionVentaItems.Where(p => p.OrdenVentaFormato.OrdenVentaItem.idOrdenVenta == idOrdenVenta
                                                            & p.RendicionVenta.idConcepto == 2);   //bono

                        if (bono.Count() > 0)
                        {
                            throw new Exception("Existe pago de la Bono,no cambie el formato de Venta:");
                        }
                    }
                    if (idFormatoVenta == 1)//ch
                    {
                        //CH
                        var ch = _db.RendicionVentaItems.Where(p => p.OrdenVentaFormato.OrdenVentaItem.idOrdenVenta == idOrdenVenta
                                                            & p.RendicionVenta.idConcepto == 3);

                        if (ch.Count() > 0)
                        {
                            throw new Exception("Existe pago de la CH,No cambie el tipo de Venta");
                        }
                    }
                }
                if (ordenVenta.idCliente != idCliente)
                {
                        if ((_db.DocumentoVentas.Where(p => p.OrdenVentaItem.idOrdenVenta == idOrdenVenta).Count() > 0))
                        {
                            throw new Exception("Existe Documentos de Venta");
                        }
                }

                ordenVenta.UpdateSet(idCliente,
                    bitcopropietario?idCoCliente:null,
                    bitcopropietario,
                    fecha,
                    idFormatoVenta,
                    idEmpleadoEmisor,                    
                    empleado.usuario,
                    comentario,
                     bitCuentaAhorro==true?1:2,
                     idBanco==0?null:idBanco);

                _db.SubmitChanges();
                DataSet dsDiferencias = new DataSet();

                                                                                                
                if (entitylist.HasChanges())
                {
                    dsDiferencias.Merge(entitylist.GetChanges());

                    foreach (DataRow drw in dsDiferencias.Tables["OrdenVentaItemInfo"].Rows)
                    {
                        if (drw.RowState == DataRowState.Modified)
                        {
                            
                            // no puede cambiar la unidad inmobilario si existe documentos de venta  registrado
                            var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));
                            OrdenVentaItem ordenVentaitem = _db.OrdenVentaItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));

                            //necesario para no permitir cambio de formato de venta o UI

                            var formato = ordenVentaitem.OrdenVentaFormatos.Where(p => (p.idConcepto == 2 | p.idConcepto == 3) & p.totalPago > 0).Count();

                            if (ordenVentaitem.idUI != drw.Field<int>("idUI"))
                            {
                                if (UI.idEstado != 1)
                                {
                                    throw new Exception("el {0} {1} no  esta disponible ".Fmt(UI.UITipo.descripcion, UI.codigo));
                                }
                                //si existe pago bono o CH no puede cambiar
                                
                                if (formato > 0)
                                {
                                    throw new Exception("Elimine el Pago de Bono,CH , si desea cambiar la UI {0}{1}".Fmt(UI.UITipo.descripcion, UI.codigo));
                                }
                            }
                            
                            // la moneda tiene que ser igual
                            if (UI.idMoneda != ordenVentaitem.idMoneda)
                            {
                                throw new Exception("Elimine o cambie de UI, movimientos solo es en {0}".Fmt(ordenVentaitem.Moneda.descripcion));
                            }

                            if (ordenVenta.idFormatoVenta != idFormatoVenta)
                            {
                                if (formato > 0)
                                {
                                throw new Exception("Elimine o cambie el Formato de venta si existe pago de BONO o Credito Hipotecario en  UI: {0} {1}".Fmt(UI.UITipo.descripcion, UI.codigo));
                                }
                            }


                            var ordenventaFormato = ordenVentaitem.OrdenVentaFormatos.Single(p => p.idOrdenVentaItem == ordenVentaitem.idInternal & (p.idConcepto == 4));

                            if (drw.Field<decimal>("totalSeparacion") != ordenventaFormato.total)
                            {
                                if (ordenventaFormato.totalPago != 0)
                                {

                                    throw new Exception("Existe pago de la separacion,no cambie en monto:{0}".Fmt(ordenventaFormato.total));
                                   
                                }
                            }


                           //actualizamos el anterior
                            var UIodd = _db.UIs.Single(p => p.idInternal == ordenVentaitem.idUI);
                            UIodd.SetUpdateEstado(1); //disponible

                            ordenVentaitem.UpdateSet(UI.idMoneda, UI.idInternal, UI.precio, drw.Field<bool>("bitFinanciado"));
                            UI.SetUpdateEstado(2); //Separado

                            _db.SubmitChanges();

                            // volvemos a actualizar  los formatos
                           

                            UpdateFormatoVenta(_db, ordenVentaitem, ordenVenta, drw.Field<decimal>("totalSeparacion"));
                            
                        }
                        if (drw.RowState == DataRowState.Deleted)
                        {
                            drw.RejectChanges();
                            OrdenVentaItem ordenVentaitem = _db.OrdenVentaItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                            // no debe de cambiar el  la unidad inmovilir cambio

                            var pagos = _db.RendicionVentaItems.
                                            Where(p => p.OrdenVentaFormato.idOrdenVentaItem == ordenVentaitem.idInternal);
                               
                            if  (pagos.Count()>0)
                            {
                                throw new Exception("Existen pagos de la Unidad Inmobiliaria {0} que intenta eliminar".Fmt(ordenVentaitem.UI.descripcion));
                            }


                            
                            var UI = _db.UIs.Single(p => p.idInternal == ordenVentaitem.UI.idInternal);
                            
                            UI.SetUpdateEstado(1); //disponible 

                            _db.OrdenVentaFormatos.DeleteAllOnSubmit(ordenVentaitem.OrdenVentaFormatos);
                            _db.OrdenVentaItems.DeleteOnSubmit(ordenVentaitem);
                            

                            _db.SubmitChanges();
                        }


                        if (drw.RowState == DataRowState.Added)
                        {
                            var UI = _db.UIs.Single(p => p.idInternal == drw.Field<int>("idUI"));

                            if (UI.idEstado != 1)
                            {
                                throw new Exception("el {0} {1} no  esta disponible ".Fmt(UI.UITipo.descripcion, UI.codigo));
                            }


                            OrdenVentaItem ordenVentaItem = new OrdenVentaItem();
                            ordenVentaItem.AddSet(_db,
                                   ordenVenta.idInternal,
                                   drw.Field<int>("idUI"),
                                   UI.idMoneda,
                                   UI.precio,
                                   drw.Field<bool>("bitFinanciado"));
                            // su formato de Venta

                            _db.SubmitChanges();
                            AddFormatoVenta(_db, ordenVentaItem, ordenVenta, drw.Field<decimal>("totalSeparacion"));

                            //actualiza la UI
                            UI.SetUpdateEstado(2); //separado
                            _db.SubmitChanges();
                        }

                    }

                   
                }

                
                //_db.SubmitChanges();

                if (formatoVenta.bitCH)
                {
                    var e = ordenVenta.OrdenVentaRequisitos.SingleOrDefault(p => p.idRequisitoItem == 11); //11 carta de aprobación
                    if (e == null)
                    {
                        OrdenVentaRequisito ovRequisito = new OrdenVentaRequisito();
                        ovRequisito.AddSet(_db, 11, false, ordenVenta.idInternal, null);  //11 carta de  aprobacion
                        _db.SubmitChanges();
                    }

                }
                else
                {
                    var e = ordenVenta.OrdenVentaRequisitos.SingleOrDefault(p => p.idRequisitoItem == 11); //11 carta de aprobación
                    if (e != null)
                    {
                        _db.OrdenVentaRequisitos.DeleteOnSubmit(e);
                        _db.SubmitChanges();
                    }
                }

                
                
                ts.Complete();
                return ordenVenta.idInternal;

            }
        }


        public void  DeleteOrdenVenta(int idOrdenVenta)

        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                OrdenVenta ordenVeta = _db.OrdenVentas.Single(p => p.idInternal == idOrdenVenta);

                foreach (var item in ordenVeta.OrdenVentaItems)
                {
                    if (item.DocumentoVentas.Count > 0)
                    {
                        throw new Exception("Existe  documentos de Venta Creados / Anulados, verifique");
                    }
                    
                }

                
                foreach (var item in ordenVeta.OrdenVentaItems)
                {
                    DAL.UI ui = _db.UIs.Single(p => p.idInternal == item.idUI);

                    if (ui.idEstado==1)
                    {
                      throw  new Exception("Verifique el estado de la Unidad Inmobiliaria");
                    }
                    
                    ui.SetUpdateEstado(1); //liberado

                     foreach (var formato in item.OrdenVentaFormatos)
                     {
                            if (formato.totalPago>0)
                            {
                            throw  new Exception("Existe  Pagos ");
                            }
                         if (formato.DocumentoVentaItems.Count()>0)
                         {
                             throw  new Exception("Existe  Documentos de venta");
                         }
                            
                     }
                    _db.OrdenVentaFormatos.DeleteAllOnSubmit(item.OrdenVentaFormatos);
                }
                var q=_db.FinanciamientoItems.Where(p=>p.Financiamiento.idOrdenVenta==idOrdenVenta);

                _db.FinanciamientoItems.DeleteAllOnSubmit(q);
                _db.Financiamientos.DeleteAllOnSubmit(ordenVeta.Financiamientos);
                _db.OrdenVentaItems.DeleteAllOnSubmit(ordenVeta.OrdenVentaItems);
                _db.OrdenVentaRequisitos.DeleteAllOnSubmit(ordenVeta.OrdenVentaRequisitos);
                _db.OrdenVentaContratos.DeleteAllOnSubmit(ordenVeta.OrdenVentaContratos);
                _db.OrdenVentaSegs.DeleteOnSubmit(ordenVeta.OrdenVentaSeg);

                _db.OrdenVentas.DeleteOnSubmit(ordenVeta);
               
                _db.SubmitChanges();
                ts.Complete();
         }

        }


        public List<OrdenVentaItemInfo> GetOrdenVentaItem(int idOrdenVenta)
        {
            var q = from a in DbUtil.Db.OrdenVentaItems
                    where a.idOrdenVenta == idOrdenVenta
                    select new OrdenVentaItemInfo
                    {
                        bitFinanciado = a.bitFinanciado,
                        codigo = a.UI.codigo,
                        descripcion = a.UI.descripcion,
                        idInternal = a.idInternal,
                        idUI = a.idUI,
                        localizacion=a.UI.UILocalizacion.descripcion,
                        LocalizacionStr = string.Format("{0} {1}", a.UI.UILocalizacion.descripcion, a.UI.UIBloque.descripcion),
                        moneda = a.Moneda,
                        piso = a.UI.UIBloque.descripcion,
                        etapa=a.UI.Etapa.descripcion,
                        total = a.total,                                                      
                        idOrdenVenta=a.idOrdenVenta,
                        idProyecto=a.OrdenVenta.idProyecto,
                        totalSeparacion=a.OrdenVentaFormatos.Single(p=>p.idConcepto==4).total,
                         
                    };

                   return q.ToList();
        }


        public List<OrdenVentaFormatoList> GetOrdenVentaFormato(int idOrdenVenta)
        {
            var q = (from a in DbUtil.Db.OrdenVentaFormatos
                    where a.OrdenVentaItem.idOrdenVenta== idOrdenVenta 
                    & (a.total-a.totalFin>0
                    | a.totalPago<0)
                    select new OrdenVentaFormatoList
                    {
                        UIStr = a.OrdenVentaItem.UI.codigo,
                        idInternal = a.idInternal,
                        LocalizacionStr = string.Format("{0} {1}", a.OrdenVentaItem.UI.UILocalizacion.descripcion, a.OrdenVentaItem.UI.UIBloque.descripcion),
                        idMoneda = a.idMoneda,
                        totalStr = string.Format("{0} {1:N}",a.Moneda.simbol,a.total),
                        idOrdenVenta = a.OrdenVentaItem.idOrdenVenta,
                        concepto=a.ConceptoItem.descripcion,
                        fechaVencimientoStr=a.fechaVencimiento.ToShortDateString(),
                        fechaVencimiento=a.fechaVencimiento,
                        tipoUI=a.UITipo.descripcion,
                        idtipoUI=a.UITipo.idInternal,
                        SaldoStr=string.Format("{0} {1:N}",a.Moneda.simbol,a.total-a.totalFin-a.totalPago),
                        totalFinStr = string.Format("{0} {1:N}", a.Moneda.simbol, a.totalFin),
                        numDocumento=a.numDocumento,

                    }).OrderBy(a => a.fechaVencimiento).OrderByDescending(p => p.idtipoUI);

            return q.ToList();
        }
        
        public int AddCuotas(
                   int idOrdenVenta,
                    int idOrdenVentaItem,
                    int idMoneda,
                    int idTipoUI,
                   DateTime fecha,
                   decimal totalCuota,
                   string comentario,
                   List<OrdenVentaFormatoItemInfo> origen,
                   List<OrdenVentaFormatoItemInfo> destino
           )
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());


                Empleado empleado = _db.Empleados.Single(p => p.idInternal == idEmpleadoEmisor);
                //OrdenVenta ordenVenta = _db.OrdenVentaItems.Single(p => p.idInternal == idOrdenVenta).OrdenVenta;
                Moneda moneda = _db.Monedas.Single(p => p.idInternal == 4); //por la moneda dolares
                decimal tipoCambioDollar = moneda.getTipoCambio(_db, fecha);

                //caso de tener padre


                //Folio folio = _db.Folios.Single(p => p.idProyecto == idProyecto & p.idDocumentoTipo == idDocumentoTipo & p.bitActivo == true);

                //la serie es por proyecto?

                //folio.Upda
                //teActual(folio.actual + 1);

                //por cada vuelta debemos tener DECRECE desde ABCDE
                //Por cada CUOTA 01,02,03,04
                //si es refinanciado se coloca 0101
                // por PROYECTO 
                //ejemplo  A020001,A02002,B0202001,C0102001,RA

                var q= _db.Financiamientos.Where(p => p.idOrdenVenta == idOrdenVenta);


                var idUltimofinanciado=(q.Count()>0?q.Max(p=>p.idInternal):0);

                Financiamiento nuevofinanciamiento = new Financiamiento();

                nuevofinanciamiento.AddSet(_db,
                                        idOrdenVenta,
                                        nuevofinanciamiento.GetCorrelativo(_db, idUltimofinanciado),
                                        fecha,
                                        idEmpleadoEmisor,
                                        empleado.descripcion,
                                        idMoneda,
                                        totalCuota,
                                        comentario);

                _db.SubmitChanges();

                if (origen.Sum(p=>p.total)!=destino.Sum(p=>p.total))
                {

                    throw new Exception("El monto Fraccionado debera de ser igual  al total de cuotas");
                }


                // actualizo el origen
                foreach (OrdenVentaFormatoItemInfo drw in origen)
                {
                    //agrego
                    var financiamientoItem = new FinanciamientoItem();
                    financiamientoItem.AddSet(_db, drw.idInternal, nuevofinanciamiento.idInternal, drw.total);
                    _db.SubmitChanges();
                    //actualizamos el original con los nuevos valores

                    var OrdenventaFormato = _db.OrdenVentaFormatos.Single(p => p.idInternal == drw.idInternal);
                    OrdenventaFormato.UpdateTotalFin(OrdenventaFormato.GetTotalFinanciado());
                    _db.SubmitChanges();

                }
                foreach (var item in destino)
                {
                   
                    ConceptoItem ci=_db.ConceptoItems.Single(p=>p.idInternal==item.idConcepto);
                    var ordenVentaDestion = new OrdenVentaFormato();

                        ordenVentaDestion.addSet(_db, item.idConcepto,
                            ordenVentaDestion.GetCorrelativo(nuevofinanciamiento.numDocumento,ci),
                            item.total, 
                            idMoneda, 
                            idOrdenVentaItem, 
                            idTipoUI,
                            nuevofinanciamiento.idInternal, item.fechaVencimiento);
                        _db.SubmitChanges();
                }

                // los montos no debe ser  diferentes
                //if (nuevofinanciamiento.totalCuota != nuevofinanciamiento.FinanciamientoItems.Sum(p => p.total))
                //{
                //    throw new Exception("Existe diferencia en montos de cuota, verique");
                //}

                //actualiza pagos


                _db.SubmitChanges();
                //caso del copropietario


                ts.Complete();
                return nuevofinanciamiento.idInternal;



            }
        }

        public void DeleteCuotas(int idFinanciamiento)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());


                Empleado empleado = _db.Empleados.Single(p => p.idInternal == idEmpleadoEmisor);

                var financiamiento = _db.Financiamientos.Single(p => p.idInternal == idFinanciamiento);



                //-----------------------proceso de eliminacion del formato de venta
                //1.- recuperamos los valores para ser utilizado ser recalculados los valores originales

                var  listOrigen=financiamiento.FinanciamientoItems.Select(p=>p.idOrdenVentaFormato).ToList();

                //2.---eliminamos los destinos /origen
                _db.FinanciamientoItems.DeleteAllOnSubmit(financiamiento.FinanciamientoItems);


                foreach (var item in financiamiento.OrdenVentaFormatos)
                {
                    // no debe estar financiados o pagado
                    if (item.FinanciamientoItems.Count()>0 )
                    {
                        throw new Exception(" La {0}: con  {1:N} tiene nuevas cuotas".Fmt(item.ConceptoItem.descripcion, item.total));
                    };
                    if (item.RendicionVentaItems.Count > 0)
                    {
                        throw new Exception(" La {0}: con {1:N} tiene Pagos realizados".Fmt(item.ConceptoItem.descripcion, item.total));
                    };

                    item.totalFin = item.GetTotalFinanciado();
                }
                _db.OrdenVentaFormatos.DeleteAllOnSubmit(financiamiento.OrdenVentaFormatos);
                
                
                _db.Financiamientos.DeleteOnSubmit(financiamiento);
                _db.SubmitChanges();
                //
                //3-actualizamos el total
                            var qorigenOdd= from a in _db.OrdenVentaFormatos
                                            where listOrigen.Contains(a.idInternal)
                                            select a;
                
                             foreach (var item in qorigenOdd)
	                        {
                                 // no debe estar financiados o pagado
                                
                                
		                        item.totalFin=item.GetTotalFinanciado();
	                        }
                            _db.SubmitChanges();

                ts.Complete();
            }
        }


        public void UpdateDatosMinuta(int idOrdenVenta,
            DateTime? minFechaPrint,
            DateTime? minFechaFirmCliente,
            DateTime? minfechaFirmEmpresa, 
            DateTime? minfechaFirmBanco)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                OrdenVentaSeg ordenventaSeg = _db.OrdenVentaSegs.Single(p => p.idOrdenVenta == idOrdenVenta);
                ordenventaSeg.UpdateSetMinuta(minFechaPrint, minFechaFirmCliente, minfechaFirmEmpresa, minfechaFirmBanco);

                _db.SubmitChanges();
                ts.Complete();
            }

        }

        public void UpdateDatosEnvio(int idOrdenVenta,
                                    DateTime? envioNotaria,
                                    DateTime? envioBanco,
                                    DateTime? envioCofide,
                                    DateTime? envioFMV)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                OrdenVentaSeg ordenventaSeg = _db.OrdenVentaSegs.Single(p => p.idOrdenVenta == idOrdenVenta);
                ordenventaSeg.UpdateSetEnvio(envioNotaria,envioBanco,envioCofide,envioFMV);

                _db.SubmitChanges();
                ts.Complete();
            }

        }


        public void UpdateDatosEscritura(int idOrdenVenta,
                                DateTime? escriturakardex, 
                                string escrituraKardexNum, 
                                DateTime? escrituraPrint, 
                                DateTime? escrituraFirmCliente, 
                                DateTime? escrituraFirmEmpresa, 
                                DateTime? escrituraFirmBanco)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                OrdenVentaSeg ordenventaSeg = _db.OrdenVentaSegs.Single(p => p.idOrdenVenta == idOrdenVenta);
                ordenventaSeg.UpdateSetEscritura(escriturakardex, escrituraKardexNum, escrituraPrint, escrituraFirmCliente, escrituraFirmEmpresa, escrituraFirmBanco);

                _db.SubmitChanges();
                ts.Complete();
            }

        }


        public void UpdateDatosLegal(int idOrdenVenta,
                                 DateTime? legalInsCliente,
                                 DateTime? legalEntrega, 
                                DateTime? legalHipotOtroBanco)
        {
            using (TransactionScope ts = new TransactionScope())
            {


                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                OrdenVentaSeg ordenventaSeg = _db.OrdenVentaSegs.Single(p => p.idOrdenVenta == idOrdenVenta);
                ordenventaSeg.UpdateSetLegal(legalInsCliente,legalEntrega,legalHipotOtroBanco);

                _db.SubmitChanges();
                ts.Complete();
            }

        }


        public FormatVentaCalInfo calcularFormatoVenta(  dbGestionDataContext _db,
                                        FormatoVenta tipoFormatoVenta,
                                        int anioBono,
                                        IEnumerable<DataRow> coleccion,
                                        CuentaFinanciamiento cuentafinanciamiento)
        {

            
            // solo el departamento/lotes
            // para el caso de departamentos 

            var uibono = _db.UIBonos.SingleOrDefault(p => p.anio == anioBono);
            if (uibono == null)
            {
                throw new Exception("Verifique Bono periodo {0}".Fmt(anioBono));
            }
            //_db.UIs.Single(p=>p.idInternal==id
            FormatVentaCalInfo info = new FormatVentaCalInfo();

            foreach (var item in coleccion)
            {
                var unidad = _db.UIs.Single(p => p.idInternal == item.Field<int>("idUI"));

                decimal contado = 0;
                decimal Bono = 0;
                decimal cuotaInicial = 0;
                decimal CH = 0;
                decimal separacion = 0;

                decimal totalUI = unidad.precio;
                //---------------- para el calculo de los saldos segun venta
                // para el caso de contado debe estar en  false los 2 var, bono,banco,

                if (item.Field<bool>("bitFinanciado"))
                {

                    //con beneficios de estado o fracmentado
                    if (tipoFormatoVenta.bitBono == true)
                    {
                        // // solo el departamento/lotes
                        if (unidad.UITipo.bitBono)
                        {
                            Bono = uibono.valor;
                        }
                    }

                    if (tipoFormatoVenta.bitBanco == true)
                    {
                        // del total del CI 
                        // para el calculo del CI necesito saber la banco y su proyecto, no es necesario la moneda


                        if (cuentafinanciamiento != null)
                        {
                            // si existe entonces esto pertence al financiamiento
                            if (unidad.UITipo.bitCH)
                            {
                                cuotaInicial = (cuentafinanciamiento.bitEsMontoCI) ? cuentafinanciamiento.cuotaInicial : cuentafinanciamiento.cuotaInicial / 100 * totalUI;
                                CH = totalUI - cuotaInicial - Bono;
                            }
                            else
                            {
                                CH = 0;


                            }

                        }
                    }
                }

                //if (unidad.UITipo.bitSeparacion)
                //{
                //    separacion = unidad.montoSeparacion;
                //}

                contado = totalUI - CH - Bono - separacion;
                info.total = info.total + totalUI;
                info.separacion =info.separacion + separacion;
                info.contado =info.contado+ contado;
                info.bono =info.bono+ Bono;
                info.creditoHipotecario =info.creditoHipotecario+ CH;    

            }
            return info;
        }



        public IEnumerable<VentaIndicadorInfo> GetVentaBruta(int idProyecto,bool esCantidad,
                                            int anio,
                                            int mesIni)
        {
            var q = from a in DbUtil.Db.OrdenVentaItems
                    where a.OrdenVenta.idProyecto == idProyecto
                    select new VentaIndicadorInfo
                    {
                          

                    };

                   return q;

        }

        public IEnumerable<OrdenVentaFormatoDetalleInfo> GetOrdenVentaFormatoDetalle(int idProyecto,
                                                                                int idCliente,
                                                                                int idEtapa,
                                                                                int concepto,
                                                                                int idLocalizacion, 
                                                                                int idTipoUI,
                                                                                int idEstado)
        {

            DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

             Menu ClienteRead =DbUtil.Db.Menus.Single(p=>p.idInternal==111);


            var q = from a in DbUtil.Db.OrdenVentaFormatos
                    where
                    a.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                    & (idCliente == 0 ? a.OrdenVentaItem.OrdenVenta.idCliente != 0 : a.OrdenVentaItem.OrdenVenta.idCliente == idCliente)
                    & a.OrdenVentaItem.OrdenVenta.idEstado!= 10 ///anulado
                    & (idEstado==0?a.OrdenVentaItem.OrdenVenta.idEstado != idEstado: a.OrdenVentaItem.OrdenVenta.idEstado==idEstado) ///
                    & a.OrdenVentaItem.UI.Etapa.bitActivo == true
                    & (idEtapa == 0 ? a.OrdenVentaItem.UI.idEtapa != 0 : a.OrdenVentaItem.UI.idEtapa == idEtapa)
                    & (idLocalizacion == 0 ? a.OrdenVentaItem.UI.idLocalizacion != 0 : a.OrdenVentaItem.UI.idLocalizacion== idLocalizacion)
                    & (idTipoUI == 0 ? a.OrdenVentaItem.UI.idTipoUI != 0 : a.OrdenVentaItem.UI.idTipoUI == idTipoUI)
                    & a.total-a.totalFin-a.totalPago > 0  
                    & (concepto == 0 ? a.idConcepto != concepto : (concepto == 1 ? (a.idConcepto != 2 & a.idConcepto != 3 & a.idConcepto != 4) : a.idConcepto == concepto))
                    orderby a.fechaVencimiento
                    select new OrdenVentaFormatoDetalleInfo
                    {

                        concepto = a.ConceptoItem.descripcion,
                        esTotal = false,
                        ordenVenta="OV-"+a.OrdenVentaItem.OrdenVenta.numDocumento,
                        codigo=a.numDocumento,
                        estado=a.OrdenVentaItem.OrdenVenta.EstadoItem.descripcion,
                        idUI = a.OrdenVentaItem.idUI,
                        idOrdenVenta=a.OrdenVentaItem.idOrdenVenta,
                        idProyecto=a.OrdenVentaItem.OrdenVenta.idProyecto,
                        idconcepto = a.idConcepto,
                        UIStr = a.OrdenVentaItem.UI.UILocalizacion.descripcion+"-"+a.OrdenVentaItem.UI.descripcion, 
                        UI=a.OrdenVentaItem.UI.descripcion,
                        localizacion=a.OrdenVentaItem.UI.UILocalizacion.descripcion,
                        etapa=a.OrdenVentaItem.UI.Etapa.descripcion,
                        
                        cliente=a.OrdenVentaItem.OrdenVenta.Cliente.descripcion,
                        formularioCliente=string.Format("javascript:loadTabFromForm('tab{0}','{1}','{2}?id={3}');",
                                           ClienteRead.idAplicacion,
                                           ClienteRead.Aplicacion.title ,
                                           ClienteRead.url,
                                           a.OrdenVentaItem.OrdenVenta.Cliente.idInternal),
                        fecha = a.fechaVencimiento.ToShortDateString(),
                        
                        fechaSep=a.OrdenVentaItem.OrdenVenta.fecha.ToShortDateString(),
                        fechaVenta= a.OrdenVentaItem.OrdenVenta.fechaVenta.Value,
                        hasta30 =a.OrdenVentaItem.OrdenVenta.idEstado==7?
                                    (((fechaComparar - a.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 30) ? a.total - a.totalFin - a.totalPago : 0)
                                    :(((fechaComparar - a.OrdenVentaItem.OrdenVenta.fecha).Days <= 30) ? a.total : 0)
                                        ,
                        
                        hasta3060 = a.OrdenVentaItem.OrdenVenta.idEstado==7?
                                    (((fechaComparar - a.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 30
                                    & (fechaComparar - a.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 60) ? a.total - a.totalFin - a.totalPago : 0)

                                    : (((fechaComparar - a.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                    & (fechaComparar - a.OrdenVentaItem.OrdenVenta.fecha).Days <= 60)? a.total: 0),

                        hasta60mas = a.OrdenVentaItem.OrdenVenta.idEstado == 7 ?
                                     (((fechaComparar - a.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 60) ? a.total - a.totalFin - a.totalPago : 0)
                                    :(((fechaComparar - a.OrdenVentaItem.OrdenVenta.fecha).Days > 60)? a.total: 0)
                    };



         
            return q;
        }



        public IEnumerable<OrdenVentaDetalleInfo> GetOrdenVentaDetalle(int idProyecto,  int idEstado,
                                                                                    int idEtapa, 
                                                                                    int idLocalizacion,
                                                                                    int idTipoUI, 
                                                                                    int anio,
                                                                                    int mes,
                                                                                    int EsFechaVenta)
        {

            DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

            Menu ClienteRead = DbUtil.Db.Menus.Single(p => p.idInternal == 111);


            var q = from a in DbUtil.Db.OrdenVentaItems
                    where
                    a.OrdenVenta.idProyecto == idProyecto
                    & a.OrdenVenta.idEstado==idEstado
                    & (mes == 0 ?
                            (EsFechaVenta==0? 
                                    a.OrdenVenta.fecha.Month != 0:
                                    a.OrdenVenta.fechaVenta.Value.Month!=0) :
                             (EsFechaVenta==0? 
                                    a.OrdenVenta.fecha.Month == mes:
                                    a.OrdenVenta.fechaVenta.Value.Month==mes)  )

                    & (anio == 0 ? 
                            (EsFechaVenta==0? 
                                    a.OrdenVenta.fecha.Year != 0 : 
                                    a.OrdenVenta.fechaVenta.Value.Year!=0):
                             (EsFechaVenta==0? 
                                    a.OrdenVenta.fecha.Year == anio:
                                    a.OrdenVenta.fechaVenta.Value.Year==anio))
                    
                    & a.OrdenVenta.idEstado != 10 ///anulado
                    & a.UI.Etapa.bitActivo == true
                    & (idEtapa == 0 ? a.UI.idEtapa != 0 : a.UI.idEtapa == idEtapa)
                    & (idLocalizacion == 0 ? a.UI.idLocalizacion != 0 : a.UI.idLocalizacion == idLocalizacion)
                    & (idTipoUI == 0 ? a.UI.idTipoUI != 0 : a.UI.idTipoUI == idTipoUI)
                    //& a.total - a.totalFin - a.totalPago > 0
                    
                    orderby a.OrdenVenta.fecha
                    select new OrdenVentaDetalleInfo
                    {
                        esTotal = false,
                        ordenVenta = "OV-" + a.OrdenVenta.numDocumento,
                        estado = a.OrdenVenta.EstadoItem.descripcion,
                        idUI = a.idUI,
                        idOrdenVenta = a.idOrdenVenta,
                        idProyecto = a.OrdenVenta.idProyecto,
                        UIStr = a.UI.UILocalizacion.descripcion + "-" + a.UI.descripcion,
                        UI = a.UI.descripcion,
                        localizacion = a.UI.UILocalizacion.descripcion,
                        etapa = a.UI.Etapa.descripcion,
                        concepto=a.OrdenVenta.FormatoVenta.descripcion,
                        cliente = a.OrdenVenta.Cliente.descripcion,
                        formularioCliente = string.Format("javascript:loadTabFromForm('tab{0}','{1}','{2}?id={3}');",
                                           ClienteRead.idAplicacion,
                                           ClienteRead.Aplicacion.title,
                                           ClienteRead.url,
                                           a.OrdenVenta.Cliente.idInternal),
                        fechaSep = a.OrdenVenta.fecha.ToShortDateString(),
                        fechaVen=a.OrdenVenta.fechaVenta,
                        
                        total=a.total,
                        totalStr=string.Format("{0} {1:N}",a.OrdenVenta.Moneda.simbol,a.total),


                        saldo=a.OrdenVentaFormatos.Sum(p=>p.total-p.totalFin-p.totalPago),
                        saldoStr = string.Format("{0} {1:N}", a.OrdenVenta.Moneda.simbol, a.OrdenVentaFormatos.Sum(p => p.total-p.totalFin - p.totalPago)),

                        totalPago=a.OrdenVentaFormatos.Sum(p=>p.totalPago),
                        totalPagoStr = string.Format("{0} {1:N}", a.OrdenVenta.Moneda.simbol, a.OrdenVentaFormatos.Sum(p => p.totalPago)),

                         banco=a.OrdenVenta.idBanco!=null?a.OrdenVenta.Banco.descripcion:"",
                          EsCuentaAhorro=a.OrdenVenta.cuentaAhorro==1?"Si":"No",
                           vendedor=a.OrdenVenta.Empleado.descripcion
                          



                    };




            return q;
        }

        public IEnumerable<OrdenVentaAnuladoDetalleInfo> GetOrdenVentaAnuladoDetalle(int idProyecto,
                                                                                int idEtapa,
                                                                                int idLocalizacion,
                                                                                int idTipoUI,int anio,int mes)
        {

            //DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

            Menu ClienteRead = DbUtil.Db.Menus.Single(p => p.idInternal == 111);


            var q = from a in DbUtil.Db.OrdenVentaItems
                    where
                    a.OrdenVenta.idProyecto == idProyecto
                    & a.OrdenVenta.idEstado == 10 ///anulado
                    & a.UI.Etapa.bitActivo == true
                    & (idEtapa == 0 ? a.UI.idEtapa != 0 : a.UI.idEtapa == idEtapa)
                    & (idLocalizacion == 0 ? a.UI.idLocalizacion != 0 : a.UI.idLocalizacion == idLocalizacion)
                    & (idTipoUI == 0 ? a.UI.idTipoUI != 0 : a.UI.idTipoUI == idTipoUI)
                    & (mes == 0 ? a.OrdenVenta.fechaAnula.Value.Month != 0 :
                                    a.OrdenVenta.fechaAnula.Value.Month ==mes)

                    & (anio == 0 ?a.OrdenVenta.fechaAnula.Value.Year !=0 :
                                    a.OrdenVenta.fechaAnula.Value.Year == anio)
            
                    orderby a.OrdenVenta.fechaAnula
                    select new OrdenVentaAnuladoDetalleInfo
                    {
                        
                        esTotal = false,
                        ordenVenta = "OV-" + a.OrdenVenta.numDocumento,
                        estado = a.OrdenVenta.fechaVenta!=null?"VENDIDO":"SEPARADO",
                        idUI = a.idUI,
                        idOrdenVenta = a.idOrdenVenta,
                        idProyecto = a.OrdenVenta.idProyecto,
                        
                        UIStr = a.UI.UILocalizacion.descripcion + "-" + a.UI.descripcion,
                        UI = a.UI.descripcion,
                        localizacion = a.UI.UILocalizacion.descripcion,
                        etapa = a.UI.Etapa.descripcion,
                        
                        cliente = a.OrdenVenta.Cliente.descripcion,
                        formularioCliente = string.Format("javascript:loadTabFromForm('tab{0}','{1}','{2}?id={3}');",
                                           ClienteRead.idAplicacion,
                                           ClienteRead.Aplicacion.title,
                                           ClienteRead.url,
                                           a.OrdenVenta.Cliente.idInternal),
                        fechaVenta = a.OrdenVenta.fechaVenta ,
                            usuarioAnula=a.OrdenVenta.usuarioAnula,             
                        fechaSeparacion= a.OrdenVenta.fecha.ToShortDateString(),
                        fechaAnulacion=a.OrdenVenta.fechaAnula.Value.ToShortDateString(),
                         total=a.OrdenVentaFormatos.Sum(p=>p.totalPago),
                        totalStr = string.Format("{0} {1:N}", a.OrdenVenta.Moneda.simbol,a.OrdenVentaFormatos.Sum(p => p.totalPago)),
                    };




            return q;
        }
        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaFormatoResumen(int idProyecto,
                                                int idEtapa,int tipoUI)
        {
            
            DateTime fechaComparar= new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day);



            List<OrdenVentaFormatoResumenInfo> lista = new List<OrdenVentaFormatoResumenInfo>();

            

            var collection= DbUtil.Db.ConceptoItems.Where(p=>p.idInternal==1 | p.idInternal==2 |p.idInternal==3 ).ToList();
            ConceptoItem separacion = DbUtil.Db.ConceptoItems.Single(p => p.idInternal == 4);
            collection.Insert(0, separacion);

            

            
                    foreach (var item in collection)
	                {

                              var  nuevo = new OrdenVentaFormatoResumenInfo();
                               nuevo.concepto = item.abreviacion;
                               nuevo.idconcepto = item.idInternal;

                               nuevo.cantTotalNegociado = DbUtil.Db.OrdenVentaFormatos.
                                                            Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                            & p.total>0 & p.OrdenVentaItem.OrdenVenta.idEstado!=10
                                                            & p.OrdenVentaItem.UI.Etapa.bitActivo==true
                                                            
                                                            &(tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                            p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                                            & (idEtapa==0?p.OrdenVentaItem.UI.idEtapa!= 0:
                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                            & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                    p.idConcepto == item.idInternal)
                                                            & (p.total - p.totalFin>0)  ///evitamos considerar los financiados
                                                                    ).

                                                            Select(o=>o.OrdenVentaItem.idUI).Distinct().Count();

                               nuevo.totalNegociado =   nuevo.cantTotalNegociado != 0 ?
                                                            DbUtil.Db.OrdenVentaFormatos.
                                                            Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                            & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                            & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                            & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                            p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                                            & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                            & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) : p.idConcepto == item.idInternal)
                                                            & (p.total - p.totalFin > 0)  ///evitamos considerar los financiados                                                            
                                                            ).

                                                            Sum(i => i.total - i.totalFin) : 0;   //iagual para bono y CH

                               nuevo.cantTotalCobrado = DbUtil.Db.RendicionVentaItems.
                                                            Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                            & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                            & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                                            
                                                            & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                            & (item.idInternal == 1 ? (p.OrdenVentaFormato.idConcepto != 2 & p.OrdenVentaFormato.idConcepto != 3 & p.OrdenVentaFormato.idConcepto != 4) :
                                                                                    p.OrdenVentaFormato.idConcepto==item.idInternal)
                                                            
                                                            //& (p.OrdenVentaFormato.OrdenVentaItem.OrdenVentaFormatos.Sum(p=>p.
                                                            & (p.OrdenVentaFormato.totalPago>0)
                                                            & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin -p.OrdenVentaFormato.totalPago ==0)   ///evitamos considerar los financiados                        
                                                                                                                                                                ///
                                                            ).
                                                            Select(l=>l.OrdenVentaFormato.OrdenVentaItem.idUI).
                                                            Distinct().Count();
                    
                                nuevo.totalCobrado = nuevo.cantTotalCobrado != 0 ? 
                                                            DbUtil.Db.RendicionVentaItems.
                                                            Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                            & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                            & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)                                                            
                                                            
                                                            & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                             & (item.idInternal == 1 ? (p.OrdenVentaFormato.idConcepto != 2 & p.OrdenVentaFormato.idConcepto != 3 & p.OrdenVentaFormato.idConcepto != 4) :
                                                                                     p.OrdenVentaFormato.idConcepto==item.idInternal)
                                                             & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin > 0)  ///evitamos considerar los financiados                        
                                                                                     ).
                                                             Sum(o => o.total) : 0;

                               nuevo.totalXCobrar = nuevo.totalNegociado - nuevo.totalCobrado;
                               nuevo.cantTotalXCobrar = nuevo.cantTotalNegociado - nuevo.cantTotalCobrado;
                               //-------------------------PENDIENTE DE COBRO BONO
                               //-------CANTIDAD
                               nuevo.cantHasta30 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                        & p.total > 0 
                                                                                        & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                        & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto==item.idInternal )
                                                                                        & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                            p.OrdenVentaItem.UI.idTipoUI == tipoUI)                                                            
                                                            
                                                                                        & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa== idEtapa)
                                                                                        & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                        & (p.total - p.totalFin- p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                        & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                                        Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

                        nuevo.cantHasta3060 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                            & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                            & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                p.OrdenVentaItem.UI.idTipoUI == tipoUI)                                                            
                                                                                            & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                            & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto == item.idInternal)
                                                                                            & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                            & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                            & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                                            & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60 ).
                                                                                            Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                               
                        
                        nuevo.cantHasta60mas = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                            & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                            & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI)                                                            
                                                                                            & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                            & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto == item.idInternal)
                                                                                            & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                            & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                            & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60 ).
                                                                                            Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                               //---------------------------------------------------------------------------------------------------------------------------
                               
                               //------MONTOS
                               nuevo.hasta30 = nuevo.cantHasta30 > 0 ? 
                                                DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                        & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                        & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI) 
                                                                                        & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                        & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto == item.idInternal)
                                                                                        & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                        & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                        & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                                        Sum(l => l.total) : 0;



                               nuevo.hasta3060 = nuevo.cantHasta3060 > 0 ?
                                                DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                       & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                       & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI) 
                                                                                        & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                        & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto == item.idInternal)
                                                                                        & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                        & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                        & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                                        & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60 ).
                                                                                        Sum(l => l.total) : 0;

                               nuevo.hasta60mas = nuevo.cantHasta60mas > 0 ? 
                                                DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto

                                                                                            & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                                            & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI) 
                                                                                            & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                            p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                            & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 & p.idConcepto != 4) :
                                                                                                                p.idConcepto == item.idInternal)
                                                                                            & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                            & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                            & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60 ).
                                                                                            Sum(l => l.total) : 0;

                               lista.Add(nuevo);
                      }

            return lista;
        }



        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaPendienteVenta(int idProyecto,
                                                int idEtapa, int tipoUI)
        {

            DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);


            List<OrdenVentaFormatoResumenInfo> lista = new List<OrdenVentaFormatoResumenInfo>();



            var collection = DbUtil.Db.ConceptoItems.Where(p => p.idInternal == 1 | p.idInternal == 2 | p.idInternal == 3).ToList();

            // solo son ventas segun el concepto que se tiene
            foreach (var item in collection)
            {

                var nuevo = new OrdenVentaFormatoResumenInfo();
                nuevo.concepto = item.abreviacion;
                nuevo.idconcepto = item.idInternal;
                nuevo.cantTotalNegociado = DbUtil.Db.OrdenVentaFormatos.
                                             Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                     (p.idConcepto == item.idInternal ))
                                             
                                                     ).

                                             Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

                nuevo.totalNegociado = nuevo.cantTotalNegociado != 0 ?
                                             DbUtil.Db.OrdenVentaFormatos.
                                             Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.total > 0 
                                             & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & (item.idInternal == 1 ? 
                                                        (p.idConcepto != 2 & p.idConcepto != 3) : 
                                                        (p.idConcepto == item.idInternal ))
                                             ).
                                             Sum(i => i.total - i.totalFin ) : 0;   //iagual para bono y CH

                nuevo.cantTotalCobrado = DbUtil.Db.RendicionVentaItems.
                                             Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado == 7
                                             & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                             p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)


                                             & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & (item.idInternal == 1 ? (p.OrdenVentaFormato.idConcepto != 2 & 
                                                                        p.OrdenVentaFormato.idConcepto != 3 ) :
                                                                     (p.OrdenVentaFormato.idConcepto == item.idInternal ))

                                             //& (p.OrdenVentaFormato.OrdenVentaItem.OrdenVentaFormatos.Sum(p=>p.
                                             & (p.OrdenVentaFormato.totalPago > 0)
                                             & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin - p.OrdenVentaFormato.totalPago == 0)  
                                             ///evitamos considerar los financiados                        
                    ///
                                             ).
                                             Select(l => l.OrdenVentaFormato.OrdenVentaItem.idUI).
                                             Distinct().Count();

                nuevo.totalCobrado = nuevo.cantTotalCobrado != 0 ?
                                            DbUtil.Db.RendicionVentaItems.
                                            Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                            & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado == 7
                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                            & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                            & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & (item.idInternal == 1 ? (p.OrdenVentaFormato.idConcepto != 2 & 
                                                                        p.OrdenVentaFormato.idConcepto != 3 ) :
                                                                     (p.OrdenVentaFormato.idConcepto == item.idInternal ))
                                             & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin > 0)  ///evitamos considerar los financiados                        
                                                                     ).
                                             Sum(o => o.total) : 0;

                nuevo.totalXCobrar = nuevo.totalNegociado - nuevo.totalCobrado;
                nuevo.cantTotalXCobrar = nuevo.cantTotalNegociado - nuevo.cantTotalCobrado;
                //-------------------------PENDIENTE DE COBRO BONO
                //-------CANTIDAD
                nuevo.cantHasta30 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                         & p.total > 0
                                                                         & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                         & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                ( p.idConcepto == item.idInternal ))
                                                                         & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                             p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 30).
                                                                         Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

                nuevo.cantHasta3060 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                    & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                                    & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                        p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                                    & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                    p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                    & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                       ( p.idConcepto == item.idInternal ))
                                                                                    & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                    & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                    & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 30
                                                                                    & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 60).
                                                                                    Select(o => o.OrdenVentaItem.idUI).Distinct().Count();


                nuevo.cantHasta60mas = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                    & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                                    & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                     p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                                    & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                    p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                    & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                        (p.idConcepto == item.idInternal ))
                                                                                    & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                    & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                    & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 60).
                                                                                    Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                //---------------------------------------------------------------------------------------------------------------------------

                //------MONTOS
                nuevo.hasta30 = nuevo.cantHasta30 > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                         & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                         & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                              p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                ( p.idConcepto == item.idInternal ))
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 30).
                                                                         Sum(l => l.total) : 0;



                nuevo.hasta3060 = nuevo.cantHasta3060 > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                        & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                        & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                              p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                ( p.idConcepto == item.idInternal ))
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 30
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days <= 60).
                                                                         Sum(l => l.total) : 0;

                nuevo.hasta60mas = nuevo.cantHasta60mas > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto

                                                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 7
                                                                             & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                              p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                             & (item.idInternal == 1 ? (p.idConcepto != 2 & p.idConcepto != 3 ) :
                                                                                                ( p.idConcepto == item.idInternal ))
                                                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                             & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                             & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fechaVenta.Value).Days > 60).
                                                                             Sum(l => l.total) : 0;

                lista.Add(nuevo);
            }

            return lista;
        }


        public OrdenVentaFormatoResumenInfo GetOrdenVentaPendienteSeparacion(int idProyecto,
                                                 int idEtapa, int tipoUI)
        {

            DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

            var item = DbUtil.Db.ConceptoItems.Single(p => p.idInternal == 4);

            // solo son ventas segun el concepto que se tiene
            var nuevo = new OrdenVentaFormatoResumenInfo();
            nuevo.concepto = item.abreviacion;
            nuevo.idconcepto = item.idInternal;
            nuevo.cantTotalNegociado = DbUtil.Db.OrdenVentaFormatos.
                                         Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                         & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                         & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                         p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                         
                                         & (p.total - p.totalFin > 0)  ///evitamos considerar los financiados
                                                 ).

                                         Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

            nuevo.totalNegociado = nuevo.cantTotalNegociado != 0 ?
                                         DbUtil.Db.OrdenVentaFormatos.
                                         Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                         & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                         & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                         p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
            
                                         & (p.total - p.totalFin > 0)  ///evitamos considerar los financiados                                                            
                                         ).

                                         Sum(i => i.total - i.totalFin) : 0;   //iagual para bono y CH

            nuevo.cantTotalCobrado = DbUtil.Db.RendicionVentaItems.
                                         Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                         & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado == 5
                                         & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                         & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                         p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)


                                         & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                         p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                         

                                         //& (p.OrdenVentaFormato.OrdenVentaItem.OrdenVentaFormatos.Sum(p=>p.
                                         & (p.OrdenVentaFormato.totalPago > 0)
                                         & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin - p.OrdenVentaFormato.totalPago == 0)   ///evitamos considerar los financiados                        
                ///
                                         ).
                                         Select(l => l.OrdenVentaFormato.OrdenVentaItem.idUI).
                                         Distinct().Count();

            nuevo.totalCobrado = nuevo.cantTotalCobrado != 0 ?
                                        DbUtil.Db.RendicionVentaItems.
                                        Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                        & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado == 5
                                        & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                        & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 :
                                                        p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                        & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                        p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                         
                                         & (p.OrdenVentaFormato.total - p.OrdenVentaFormato.totalFin > 0)  ///evitamos considerar los financiados                        
                                                                 ).
                                         Sum(o => o.total) : 0;

            nuevo.totalXCobrar = nuevo.totalNegociado - nuevo.totalCobrado;
            nuevo.cantTotalXCobrar = nuevo.cantTotalNegociado - nuevo.cantTotalCobrado;
            //-------------------------PENDIENTE DE COBRO BONO
            //-------CANTIDAD
            nuevo.cantHasta30 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                     & p.total > 0
                                                                     & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                     & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                         p.OrdenVentaItem.UI.idTipoUI == tipoUI)

                                                                     & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                     & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                     & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                     & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                     Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

            nuevo.cantHasta3060 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                                & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                    p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                                & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                
                                                                                & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                                & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60).
                                                                                Select(o => o.OrdenVentaItem.idUI).Distinct().Count();


            nuevo.cantHasta60mas = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                                & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                                & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                                 p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                                & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                                p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                                
                                                                                & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                                & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                                & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60).
                                                                                Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
            //---------------------------------------------------------------------------------------------------------------------------

            //------MONTOS
            nuevo.hasta30 = nuevo.cantHasta30 > 0 ?
                             DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                     & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                     & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                          p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                     & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                     
                                                                     & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                     & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                     & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                     Sum(l => l.total) : 0;



            nuevo.hasta3060 = nuevo.cantHasta3060 > 0 ?
                             DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                    & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                    & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                          p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                     & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                     
                                                                     & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                     & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                     & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                     & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60).
                                                                     Sum(l => l.total) : 0;

            nuevo.hasta60mas = nuevo.cantHasta60mas > 0 ?
                             DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto

                                                                         & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado == 5
                                                                         & (tipoUI == 0 ? p.OrdenVentaItem.UI.idTipoUI != 0 :
                                                                                          p.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                         p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                     
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & (p.total - p.totalFin - p.totalPago > 0)  ///evitamos considerar los financiados                        
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60).
                                                                         Sum(l => l.total) : 0;

           

            return nuevo;
        }  



        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaFormatoCHResumen(int idProyecto,
                                               int idEtapa)
        {

            DateTime fechaComparar = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);



            List<OrdenVentaFormatoResumenInfo> lista = new List<OrdenVentaFormatoResumenInfo>();



            
            //-------------informacion de bancos que le falta depositos de Credito hipotecario

            var collection = DbUtil.Db.CuentaFinanciamientos.Where(p => p.idProyecto == idProyecto);
            string tabla = string.Empty;


            foreach (var item in collection)
            {
               var nuevo = new OrdenVentaFormatoResumenInfo();
                nuevo.concepto = item.Banco.descripcion;
                nuevo.idconcepto = item.idBanco;


                // solo cambia el banco y que el concepto es 3

                nuevo.cantTotalNegociado = DbUtil.Db.OrdenVentaFormatos.
                                             Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                             & p.idConcepto == 3).
                                             Select(o => o.OrdenVentaItem.idUI).Distinct().Count();

                nuevo.totalNegociado = nuevo.cantTotalNegociado != 0 ?
                                             DbUtil.Db.OrdenVentaFormatos.
                                             Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                             & p.idConcepto == 3).
                                             Sum(i => i.total - i.totalFin) : 0;   //iagual para bono y CH

                nuevo.cantTotalCobrado = DbUtil.Db.RendicionVentaItems.
                                             Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                             & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                             & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                             & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                             p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                             & p.OrdenVentaFormato.idConcepto == 3).
                                             Select(l => l.OrdenVentaFormato.OrdenVentaItem.idUI).
                                             Distinct().Count();

                nuevo.totalCobrado = nuevo.cantTotalCobrado != 0 ?
                                            DbUtil.Db.RendicionVentaItems.
                                            Where(p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                            & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                            & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 :
                                                            p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)
                                             & p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                             & p.OrdenVentaFormato.idConcepto == 3).
                                             Sum(o => o.total) : 0;

                nuevo.totalXCobrar = nuevo.totalNegociado - nuevo.totalCobrado;
                nuevo.cantTotalXCobrar = nuevo.cantTotalNegociado - nuevo.cantTotalCobrado;
                //-------------------------PENDIENTE DE COBRO BONO
                //-------CANTIDAD
                nuevo.cantHasta30 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                         & p.total > 0
                                                                         & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                         & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                         & p.idConcepto == 3
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & p.totalPago == 0
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                         Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                nuevo.cantHasta3060 = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                             & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                             & p.idConcepto == 3
                                                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                             & p.totalPago == 0
                                                                             & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                             & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60).
                                                                             Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                nuevo.cantHasta60mas = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                             & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                             & p.idConcepto == 3
                                                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                             & p.totalPago == 0
                                                                             & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60).
                                                                             Select(o => o.OrdenVentaItem.idUI).Distinct().Count();
                //---------------------------------------------------------------------------------------------------------------------------

                //------MONTOS
                nuevo.hasta30 = nuevo.cantHasta30 > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                         & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                         & p.idConcepto == 3
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & p.totalPago == 0
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 30).
                                                                         Sum(l => l.total) : 0;



                nuevo.hasta3060 = nuevo.cantHasta3060 > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                                        & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                         & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                         & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                         & p.idConcepto == 3
                                                                         & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                         & p.totalPago == 0
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 30
                                                                         & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days <= 60).
                                                                         Sum(l => l.total) : 0;

                nuevo.hasta60mas = nuevo.cantHasta60mas > 0 ?
                                 DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto

                                                                             & p.total > 0 & p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                                             & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 :
                                                                                             p.OrdenVentaItem.UI.idEtapa == idEtapa)
                                                                             & p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                                             & p.idConcepto == 3
                                                                             & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                                             & p.totalPago == 0
                                                                             & (fechaComparar - p.OrdenVentaItem.OrdenVenta.fecha).Days > 60).
                                                                             Sum(l => l.total) : 0;

                lista.Add(nuevo);
            }

            return lista;
        }


        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaFormatoCHResumenMASTOTAL(int idProyecto,
                                               int idEtapa)
        {



            var lista = this.GetOrdenVentaFormatoCHResumen(idProyecto, idEtapa).ToList();
            var q = DbUtil.Db.OrdenVentaFormatos.Where(p => p.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                    & p.OrdenVentaItem.OrdenVenta.idProyecto == idProyecto
                                                    & p.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                    //& p.OrdenVentaItem.OrdenVenta.idBanco == item.idBanco
                                                    & p.idConcepto == 3
                                                    & (idEtapa == 0 ? p.OrdenVentaItem.UI.idEtapa != 0 : p.OrdenVentaItem.UI.idEtapa == idEtapa));
            var r = DbUtil.Db.RendicionVentaItems.Where(
                                                    p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                    & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.idProyecto == idProyecto
                                                    & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                    & p.OrdenVentaFormato.idConcepto==3
                                                    & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 : p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)).
                                                    Select(o => o.OrdenVentaFormato.OrdenVentaItem.idUI).Distinct();

            int cantq = q.Count();
            int canrr = r.Count();

            var totales = new OrdenVentaFormatoResumenInfo();
            totales.esTotal = true;
            totales.concepto = "TOTAL:";
            totales.totalNegociado = lista.Sum(p => p.totalNegociado);
            totales.cantTotalNegociado = cantq;


            totales.totalCobrado = lista.Sum(p => p.totalCobrado);
            totales.cantTotalCobrado = canrr;

            totales.totalXCobrar = lista.Sum(p => p.totalXCobrar);
            //totales.cantTotalXCobrar=cantq-canrr;


            totales.hasta30 = lista.Sum(p => p.hasta30);
            totales.hasta3060 = lista.Sum(p => p.hasta3060);
            totales.hasta60mas = lista.Sum(p => p.hasta60mas);



            //totales.cantHasta30 = lista.Sum(p => p.cantHasta30);
            //totales.cantHasta3060 = lista.Sum(p => p.cantHasta3060);
            //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);


            lista.Add(totales);


            return lista;
        }


        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaFormatoResumenMASTOTAL(int idProyecto,
                                               int idEtapa, int tipoUI)
        {



                    var lista = this.GetOrdenVentaFormatoResumen(idProyecto, idEtapa,tipoUI).ToList();
                    var q=DbUtil.Db.OrdenVentaItems.Where(p=>p.OrdenVenta.idEstado!=10 
                                                            & p.OrdenVenta.idProyecto==idProyecto
                                                            & p.UI.Etapa.bitActivo == true
                                                            & (tipoUI == 0 ? p.UI.idTipoUI != 0 :p.UI.idTipoUI == tipoUI) 
                                                            & (idEtapa==0?p.UI.idEtapa!=0:p.UI.idEtapa==idEtapa));
                    var r = DbUtil.Db.RendicionVentaItems.Where(
                                                            p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.idProyecto==idProyecto
                                                            & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo==true
                                                            & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 : p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI) 
                                                            & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 : p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa==idEtapa)).
                                                            Select(o=>o.OrdenVentaFormato.OrdenVentaItem.idUI).Distinct();

                    int cantq=q.Count();
                    int canrr=r.Count();
                    
                     var totales = new OrdenVentaFormatoResumenInfo();
                     totales.esTotal = true;
                     totales.concepto = "TOTAL:";
                     totales.totalNegociado = lista.Sum(p => p.totalNegociado);
                     totales.cantTotalNegociado = cantq;


                     totales.totalCobrado = lista.Sum(p => p.totalCobrado);
                     totales.cantTotalCobrado = canrr;
                     
                     totales.totalXCobrar=lista.Sum(p=>p.totalXCobrar);
                     //totales.cantTotalXCobrar=cantq-canrr;


                     totales.hasta30 = lista.Sum(p => p.hasta30);
                     totales.hasta3060 = lista.Sum(p => p.hasta3060);
                     totales.hasta60mas = lista.Sum(p => p.hasta60mas);



                     //totales.cantHasta30 = lista.Sum(p => p.cantHasta30);
                     //totales.cantHasta3060 = lista.Sum(p => p.cantHasta3060);
                     //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);


                    lista.Add(totales);
          

            return lista;
        }




        public IEnumerable<OrdenVentaFormatoResumenInfo> GetOrdenVentaPendienteResumenMASTOTAL(int idProyecto,
                                               int idEtapa, int tipoUI)
        {



            var lista = this.GetOrdenVentaPendienteVenta(idProyecto, idEtapa, tipoUI).ToList();
            var separaicion = this.GetOrdenVentaPendienteSeparacion(idProyecto, idEtapa, tipoUI);
            lista.Add(separaicion);

            var q = DbUtil.Db.OrdenVentaItems.Where(p => p.OrdenVenta.idEstado != 10
                                                    & p.OrdenVenta.idProyecto == idProyecto
                                                    & p.UI.Etapa.bitActivo == true
                                                    & (tipoUI == 0 ? p.UI.idTipoUI != 0 : p.UI.idTipoUI == tipoUI)
                                                    & (idEtapa == 0 ? p.UI.idEtapa != 0 : p.UI.idEtapa == idEtapa));
            var r = DbUtil.Db.RendicionVentaItems.Where(
                                                    p => p.OrdenVentaFormato.OrdenVentaItem.OrdenVenta.idEstado != 10
                                                    & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.idProyecto == idProyecto
                                                    & p.OrdenVentaFormato.OrdenVentaItem.UI.Etapa.bitActivo == true
                                                    & (tipoUI == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI != 0 : p.OrdenVentaFormato.OrdenVentaItem.UI.idTipoUI == tipoUI)
                                                    & (idEtapa == 0 ? p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa != 0 : p.OrdenVentaFormato.OrdenVentaItem.UI.idEtapa == idEtapa)).
                                                    Select(o => o.OrdenVentaFormato.OrdenVentaItem.idUI).Distinct();

            int cantq = q.Count();
            int canrr = r.Count();

            var totales = new OrdenVentaFormatoResumenInfo();
            totales.esTotal = true;
            totales.concepto = "TOTAL:";
            totales.totalNegociado = lista.Sum(p => p.totalNegociado);
            totales.cantTotalNegociado = cantq;


            totales.totalCobrado = lista.Sum(p => p.totalCobrado);
            totales.cantTotalCobrado = canrr;

            totales.totalXCobrar = lista.Sum(p => p.totalXCobrar);
            //totales.cantTotalXCobrar=cantq-canrr;


            totales.hasta30 = lista.Sum(p => p.hasta30);
            totales.hasta3060 = lista.Sum(p => p.hasta3060);
            totales.hasta60mas = lista.Sum(p => p.hasta60mas);



            //totales.cantHasta30 = lista.Sum(p => p.cantHasta30);
            //totales.cantHasta3060 = lista.Sum(p => p.cantHasta3060);
            //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);


            lista.Add(totales);


            return lista;
        }


        public IEnumerable<OrdenVentaFormatoDetalleInfo> GetOrdenVentaFormatoDetalleMASTOTAL(int idProyecto, int idcliente,
                                               int idEtapa, int idConcepto,int idLocalizacion,int idTipoUI,int idEstado)
        {



            var lista = this.GetOrdenVentaFormatoDetalle(idProyecto, idcliente, idEtapa, idConcepto, idLocalizacion, idTipoUI, idEstado).ToList();

            int i = 0;
            foreach (var item in lista)
            {
                i++;
                item.item = i; 
            }



            var totales = new OrdenVentaFormatoDetalleInfo();
            totales.esTotal = true;
            totales.fecha = "TOTAL:";

            totales.item = lista.Max(p=>p.item);
            totales.hasta30 = lista.Sum(p => p.hasta30);
            totales.hasta3060 = lista.Sum(p => p.hasta3060);
            totales.hasta60mas = lista.Sum(p => p.hasta60mas);
            totales.formularioCliente = "";
            totales.cliente= "";
            totales.ordenVenta = "";



            //totales.cantHasta30 = lista.Sum(p => p.cantHasta30);
            //totales.cantHasta3060 = lista.Sum(p => p.cantHasta3060);
            //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);


            lista.Add(totales);


            return lista;
        }



        public IEnumerable<OrdenVentaDetalleInfo> GetOrdenVentaDetalleMASTOTAL(int idProyecto,int idEstado,
                                                                                    int idEtapa, 
                                                                                    int idLocalizacion,
                                                                                    int idTipoUI, 
                                                                                    int anio,
                                                                                    int mes,
                                                                                    int EsFechaVenta)
        {



            var lista = this.GetOrdenVentaDetalle(idProyecto,idEstado, idEtapa, idLocalizacion, idTipoUI, anio, mes, EsFechaVenta).ToList();
            int i = 0;
            foreach (var item in lista)
            {
                i++;
                item.item=i;
                item.itemStr = i.ToString();
            }

            var totales = new OrdenVentaDetalleInfo();
            totales.esTotal = true;
            totales.itemStr=string.Format("Total: {0}", lista.Count());
            

            
            totales.formularioCliente = "";
            totales.cliente = "";
            totales.ordenVenta = "";



            totales.total= lista.Sum(p => p.total);
            totales.saldo = lista.Sum(p => p.saldo);
            totales.totalPago = lista.Sum(p => p.totalPago);
            //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);
            totales.saldoStr = String.Format("S/.{0:N}",totales.saldo);
            totales.totalStr= String.Format("S/.{0:N}", totales.total);
            totales.totalPagoStr = String.Format("S/.{0:N}", totales.totalPago);
            
            lista.Add(totales);


            return lista;
        }




        public IEnumerable<OrdenVentaAnuladoDetalleInfo> GetOrdenVentaAnuladoDetalleMASTOTAL(int idProyecto, 
                                               int idEtapa,
                int idLocalizacion,
                int idTipoUI,int anio, int mes)
        {



            var lista = this.GetOrdenVentaAnuladoDetalle(idProyecto,  idEtapa,  idLocalizacion, idTipoUI,anio,mes).ToList();
            int i = 0;
            foreach (var item in lista)
            {
                i++;
                item.item = i;
                item.itemStr = i.ToString();
            }

            var totales = new OrdenVentaAnuladoDetalleInfo();
            totales.esTotal = true;
            totales.fechaSeparacion = "TOTAL:";
            
            totales.total = lista.Sum(p => p.total);
            totales.totalStr =string.Format("S/. {0:N}", lista.Sum(p => p.total));
            totales.itemStr = string.Format("Total: {0}", lista.Count());

            totales.formularioCliente = "";
            totales.cliente= "";
            totales.ordenVenta = "";



            //totales.cantHasta30 = lista.Sum(p => p.cantHasta30);
            //totales.cantHasta3060 = lista.Sum(p => p.cantHasta3060);
            //totales.cantHasta60mas = lista.Sum(p => p.cantHasta60mas);


            lista.Add(totales);


            return lista;
        }


        



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<IndicadorAnioInfo> GetIndicadorNoAcumuladoVenta(int idProyecto,
                                                                    int anio,
                                                                    int mesini)
        {
            var grafico = new List<IndicadorAnioInfo>();

            for (int i = mesini; i <= 12; i++)
            {
                int mesper = (i <= 12 ? i : i - 12);
                int anioper = (i <= 12 ? anio : anio + 1);
               // var indicador = this.GetIndicadorNoAcumuladoMes(idProyecto, anioper, mesper);
                //grafico.Add(indicador);
            }

            return grafico;
        }


        public List<IndicadorAnioInfo> GetIndicadorNoAcumuladoMes(int idProyecto, int anio,int esAcumulado)
        {
            //considerando que todo el proyecto es en soles
            //primero los separados      //total y cantidad
            var q= from a in DbUtil.Db.OrdenVentaItems
                   where a.OrdenVenta.idProyecto==idProyecto
                   & a.OrdenVenta.idEstado!=10
                   group a by new {a.OrdenVenta.fecha.Year,a.OrdenVenta.fecha.Month} into g
                   select  new IndicadorAnioInfo
                   {
                        anio=g.Key.Year,
                        mes=g.Key.Month,
                        totalVen=0,
                        cantidadVen=0 ,
                        totalSep=g.Sum(p=>p.total),
                        cantidadSep=g.Count()

                   } ;

            //---------- No  existe ----------------------------

            //los vendidos      //total y cantidad

            var r = from a in DbUtil.Db.OrdenVentaItems
                    where a.OrdenVenta.idProyecto == idProyecto
                    & a.OrdenVenta.idEstado==7
                    group a by new { a.OrdenVenta.fechaVenta.Value.Year, a.OrdenVenta.fechaVenta.Value.Month} into g
                    select new IndicadorAnioInfo
                    {
                        anio = g.Key.Year,
                        mes = g.Key.Month,
                        totalVen = g.Sum(p => p.total),
                        cantidadVen = g.Count(),
                        totalSep=0,
                        cantidadSep=0
                        

                    };

            var w = q.Concat(r);

            var v= (from a in w
                   group a by new { a.anio, a.mes} into g
                   select new IndicadorAnioInfo
                   {
                       anio = g.Key.anio,
                       mes = g.Key.mes,
                       totalVen = g.Sum(p => p.totalVen),
                       cantidadVen = g.Sum(P=>P.cantidadVen),
                       totalSep=g.Sum(p=>p.totalSep),
                       cantidadSep=g.Sum(p=>p.cantidadSep)

                   }).OrderBy(p=>p.anio).OrderBy(o=>o.mes);

            //para el caso de no acumulados
            if (esAcumulado == 0)
                return v.Where(p=>p.anio==anio).ToList();
            //suma de acuerdo a los anios
            //EL ACUMULADO ANUAL PARA EL ANIOSIGUIENTE

            var x = (from a in w
                     group a by new { a.anio} into g
                     select new IndicadorAnioInfo
                     {
                         anio = (g.Key.anio+1),
                         mes = 0,
                         totalVen = g.Sum(p => p.totalVen),
                         cantidadVen = g.Sum(P => P.cantidadVen),
                         totalSep = g.Sum(p => p.totalSep),
                         cantidadSep = g.Sum(p => p.cantidadSep)

                     }).OrderBy(p => p.anio);


              //junto estos valores en una sola lista el 0 indica que se inicia

            var y = x.Concat(v);

               // sumamos el acumulado, todos los inferioes al mes  pero solo del anio

            var z = (from a in y
                     select new IndicadorAnioInfo
                     {
                         anio = a.anio,
                         mes = a.mes,
                         totalVen = y.Where(l=>l.mes<=a.mes & l.anio==a.anio).Count()>0? y.Where(l=>l.mes<=a.mes & l.anio==a.anio).Sum(p => p.totalVen):0,
                         cantidadVen = y.Where(l=>l.mes<=a.mes & l.anio==a.anio).Count()>0? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(P => P.cantidadVen):0,
                         totalSep =y.Where(l=>l.mes<=a.mes & l.anio==a.anio).Count()>0? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(p => p.totalSep):0,
                         cantidadSep = y.Where(l=>l.mes<=a.mes & l.anio==a.anio).Count()>0?y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(p => p.cantidadSep):0

                     }).OrderBy(p => p.anio);


            return z.Where(p=>p.anio==anio).ToList();

        }



        public List<IndicadorAnioInfo> GetIndicadorComparativoAnual(int idProyecto, int esAcumulado,int anio)
        {

            
            //considerando que todo el proyecto es en soles
            //primero los separados      //total y cantidad
            var q = from a in DbUtil.Db.OrdenVentaItems
                    where a.OrdenVenta.idProyecto == idProyecto
                    & a.OrdenVenta.idEstado != 10
                    group a by new { a.OrdenVenta.fecha.Year, a.OrdenVenta.fecha.Month } into g
                    select new IndicadorAnioInfo
                    {
                        anio = g.Key.Year,
                        mes = g.Key.Month,
                        totalVen = 0,
                        cantidadVen = 0,
                        totalSep = g.Sum(p => p.total),
                        cantidadSep = g.Count()

                    };

            //---------- No  existe ----------------------------

            //los vendidos      //total y cantidad

            var r = from a in DbUtil.Db.OrdenVentaItems
                    where a.OrdenVenta.idProyecto == idProyecto
                    & a.OrdenVenta.idEstado == 7
                    group a by new { a.OrdenVenta.fechaVenta.Value.Year, a.OrdenVenta.fechaVenta.Value.Month } into g
                    select new IndicadorAnioInfo
                    {
                        anio = g.Key.Year,
                        mes = g.Key.Month,
                        totalVen = g.Sum(p => p.total),
                        cantidadVen = g.Count(),
                        totalSep = 0,
                        cantidadSep = 0


                    };

            var w = q.Concat(r);

            var v = (from a in w
                     group a by new { a.anio, a.mes } into g
                     select new IndicadorAnioInfo
                     {
                         anio = g.Key.anio,
                         mes = g.Key.mes,
                         totalVen = g.Sum(p => p.totalVen),
                         cantidadVen = g.Sum(P => P.cantidadVen),
                         totalSep = g.Sum(p => p.totalSep),
                         cantidadSep = g.Sum(p => p.cantidadSep)

                     }).OrderBy(p => p.anio).OrderBy(o => o.mes);

            //para el caso de no acumulados
            if (esAcumulado == 0)
                return v.Where(p => p.anio == anio).ToList();
            //suma de acuerdo a los anios
            //EL ACUMULADO ANUAL PARA EL ANIOSIGUIENTE

            var x = (from a in w
                     group a by new { a.anio } into g
                     select new IndicadorAnioInfo
                     {
                         anio = (g.Key.anio + 1),
                         mes = 0,
                         totalVen = g.Sum(p => p.totalVen),
                         cantidadVen = g.Sum(P => P.cantidadVen),
                         totalSep = g.Sum(p => p.totalSep),
                         cantidadSep = g.Sum(p => p.cantidadSep)

                     }).OrderBy(p => p.anio);


            //junto estos valores en una sola lista el 0 indica que se inicia

            var y = x.Concat(v);

            // sumamos el acumulado, todos los inferioes al mes  pero solo del anio

            var z = (from a in y
                     select new IndicadorAnioInfo
                     {
                         anio = a.anio,
                         mes = a.mes,
                         totalVen = y.Where(l => l.mes <= a.mes & l.anio == a.anio).Count() > 0 ? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(p => p.totalVen) : 0,
                         cantidadVen = y.Where(l => l.mes <= a.mes & l.anio == a.anio).Count() > 0 ? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(P => P.cantidadVen) : 0,
                         totalSep = y.Where(l => l.mes <= a.mes & l.anio == a.anio).Count() > 0 ? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(p => p.totalSep) : 0,
                         cantidadSep = y.Where(l => l.mes <= a.mes & l.anio == a.anio).Count() > 0 ? y.Where(l => l.mes <= a.mes & l.anio == a.anio).Sum(p => p.cantidadSep) : 0

                     }).OrderBy(p => p.anio);


            return z.Where(p => p.anio == anio).ToList();

        }

    }
}
